﻿/*
 
三、理解上面的东西需要区分清楚一下概念的区别
1、值类型和引用类型的区别
2、值传递和引用传递(ref和out)的区别
3、传递引用类型参数和引用传递(ref和out)引用类型参数的区别 [这一点最容易混淆]
区别在于使用该参数过程中为该引用新建了对象的情况下，前者不影响原始值，后者影响原始值，示例： 

 */
using System;

namespace FunctionApplication
{
    class MyClass
    {
        public string str;
        public MyClass(string str)
        {
            this.str = str;
        }
    }

    class Program
    {
        void FunA(MyClass a)
        {
            a = new MyClass("A");
        }

        void FunB(ref MyClass a)
        {
            a = new MyClass("B");
        }

        void Test()
        {
            MyClass a = new MyClass("AA");
            FunA(a);
            Print(a); // a还是原始的对象 TEST
            FunB(ref a);
            Print(a); //a变为新对象   B
        }

        void Print(MyClass a)
        {
            Console.WriteLine(a.str);
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            p.Test();
            Console.ReadKey();
        }
    }
}
/*
 
记住一条原则：值类型传递的是值的副本，引用类型传递的是对象引用，所以值参数的修改不影响原始值，引用类型的修改影响原始值；值传递的参数构建不影响原始值，引用传递(ref和out)影响原始值。 

 */